﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebShopAPI.Models;//
using DAL;
using Models;
namespace WebShopAPI.Controllers
{
    /// <summary>
    /// 登陆模板 :注意这里的是sp_manager管理员的登陆功能
    /// </summary>
    public class loginController : ApiController
    {
        sp_managerDAL spManager_dal = new sp_managerDAL();
        sp_userDAL nj = new sp_userDAL();
        #region 登录验证接口
        public ResponData Post(LoginReqest login)
        {
            List<sp_manager> sp_ManagersList = spManager_dal.GetAllUser();
            //带帐号和密码查询
            var obj = sp_ManagersList.SingleOrDefault( //单对象查询的linq方法
                   p => p.mg_name.Trim() == login.username.Trim() //帐号
                   &&
                  p.mg_pwd.Trim() == login.password.Trim()  //密码
                  && 
                  p.mg_state==(byte)1  //状态,1说是是启用的帐号,0末启用,即冰结的,不用访问,0 也经常当作是逻辑删除 0不可以用
                );

            ResponData rd = new ResponData();
            if (obj != null)
            {
                //////可以生成JWT数据////////////
                var sign = "123"; //后台设置的密钥,也可以通过配置放在web.config中设置
                var extraHeaders = new Dictionary<string, object>
                     {
                        { "aaa", "test" }, //这个数据为扩展,暂末使用
                    };
                //过期时间(可以不设置，下面表示签名后 100000秒过期)
                double exp = (DateTime.UtcNow.AddSeconds(100000) - new DateTime(1970, 1, 1)).TotalSeconds;
                var payload = new Dictionary<string, object>
                     {
                         { "user_id", obj.mg_id }, //ID
                         { "username", obj.mg_name },//用户名
                          {"role_id",obj.role_id }, //角色ID
                         { "exp",exp } //过期时间
                          //根据时间要求还可以绑定IP地址,员工的微信认证号,等信息
                      };
                ////////////////////////////////     
                /////调用生成JWT信息///////////
                var token = JWTHelp.CreateJwtToken(payload, sign, extraHeaders);
                //定义一个响应对象
                LoginResponse loginResponse = new LoginResponse();
                //一个一个转换数据[ 为以后 DTO 引入 引用对象转换库 ]
                loginResponse.id = obj.mg_id;
                loginResponse.rid = obj.role_id;
                loginResponse.username = obj.mg_name;
                loginResponse.mobile = obj.mg_mobile;
                loginResponse.email = obj.mg_email;
                loginResponse.token=token;//生成的JWT字符串
                //转换完,设置给响应
                rd.data = loginResponse; //设置响应数据

                rd.meta = new Meta
                {
                    status = 200,
                    msg = "登陆成功"
                };
            }
            else 
            {
                rd.meta.status = 403;
                rd.meta.msg = "帐号末授权或处在冰结状态";
            }
           
          
            return rd;
        }
        #endregion
        #region 手机端登录
        [Route("api/login/sj")]
        public ResponData Post(sj login)
        {
            List<sp_user> sp_ManagersList = nj.GetAllUser();
            //带帐号和密码查询
            var obj = sp_ManagersList.SingleOrDefault( //单对象查询的linq方法
                   p => p.user_tel.Trim() == login.username.Trim() //帐号
                   &&
                  p.password.Trim() == login.password.Trim()  //密码
                    //状态,1说是是启用的帐号,0末启用,即冰结的,不用访问,0 也经常当作是逻辑删除 0不可以用
                );

            ResponData rd = new ResponData();
            if (obj != null)
            {
                //////可以生成JWT数据////////////
                var sign = "123"; //后台设置的密钥,也可以通过配置放在web.config中设置
                var extraHeaders = new Dictionary<string, object>
                     {
                        { "aaa", "test" }, //这个数据为扩展,暂末使用
                    };
                //过期时间(可以不设置，下面表示签名后 100000秒过期)
                double exp = (DateTime.UtcNow.AddSeconds(100000) - new DateTime(1970, 1, 1)).TotalSeconds;
                var payload = new Dictionary<string, object>
                     {
                         { "user_id", obj.user_id }, //ID
                         { "username", obj.username },//用户名
                         { "exp",exp } //过期时间
                          //根据时间要求还可以绑定IP地址,员工的微信认证号,等信息
                      };
                ////////////////////////////////     
                /////调用生成JWT信息///////////
                var token = JWTHelp.CreateJwtToken(payload, sign, extraHeaders);
                //定义一个响应对象
                sjdx loginResponse = new sjdx();
                //一个一个转换数据[ 为以后 DTO 引入 引用对象转换库 ]
                loginResponse.yhid = obj.user_id;
                loginResponse.yhzh = obj.user_tel;
                loginResponse.yhmm = obj.password;
                loginResponse.token = token;//生成的JWT字符串
                //转换完,设置给响应
                rd.data = loginResponse; //设置响应数据

                rd.meta = new Meta
                {
                    status = 200,
                    msg = "登陆成功"
                };
            }
            else
            {
                rd.meta.status = 403;
                rd.meta.msg = "帐号末授权或处在冰结状态";
            }


            return rd;
        }
        #endregion
    }



    //定义请求接收对象
    public class LoginReqest
    { 
        public string username { get; set; }
        public string password { get; set; }
    }
    public class sj
    {
        public string username { get; set; }
        public string password { get; set; }
    }
    public class sjdx
    {
        public int yhid { get; set; }
        public string yhzh { get; set; }
        public string yhmm { get; set; }
        public string token { get; set; }
    }

    //定义登陆响应对象类型,当然也可以用匿名类对象,创建一个类,可阅读性更好.
    public class LoginResponse
    { 
        public int id { get; set; }
        public int rid { get; set; }
        public string username { get; set; }

        public string mobile { get; set; }

        public string email { get; set; }

        public string token { get; set; }


    }
}
